Linux에서 다른 두 열을 결합하여 tsv 파일에 새 열을 만드는 방법은 무엇입니까?

Linux에서 다른 두 열을 결합하여 tsv 파일에 새 열을 만드는 방법은 무엇입니까?

다음과 같은 파일이 포함된 70개의 디렉터리가 있습니다.

STAN002
   |______ STAN002_sasions.tsv
PTAN044
   |______ PTAN044_sasions.tsv
STAN005
   |______ STAN005_sasions.tsv
STAN050
   |______ STAN050_sasions.tsv
QRED034
   |______ QRED034_sasions.tsv
.
.
.
PREC098
   |______ PREC098_sasions.tsv

다음 이미지에 표시된 것처럼 위 디렉터리의 각 파일에는 .tsv동일한 수의 열(30개 열)이 있습니다.

여기에 이미지 설명을 입력하세요.

파일의 첫 번째 열과 두 번째 열은 .tsv다음과 같습니다.

#gene1    gene2
VAV1      THAP4
ZNF75A    ZNF263
KRCC1     POLR1A
H2AFV     TANC1
B3GALT6  RP3-340N1.5
SH3BP1   CTD-2013M15.1(192243),EMB(3603711)
PTPRO     VASN

이제 Linux에서 디렉터리의 모든 파일 사이에 새 열을 만들고 awk or any bash script싶습니다 . 새로 생성된 열은 파일에 .tsv위치하게 됩니다 .31st column

1st and 2nd columns이는 이름이 로 구분된 결합된 이름처럼 보여야 합니다 --. 31st column다음과 같아야 합니다 .

gene1--gene2
VAV1--THAP4
ZNF75A--ZNF263
KRCC1--POLR1A
H2AFV--TANC1
B3GALT6--RP3-340N1.5
SH3BP1--CTD-2013M15.1(192243),EMB(3603711)
PTPRO--VASN

이 접근 방식을 시도했지만 오류가 발생했습니다.

awk '{print $0, $1 "-" $NF}' STAN002_sasions.tsv

Linux에서 모든 파일에 대해 단일 스크립트를 사용하여 이 작업을 어떻게 수행할 수 있습니까? 도움을 주시면 감사하겠습니다.

답변1

FSor 를 지정하지 않았고 두 번째 필드를 식별하는 대신 OFS사용하고 있기 때문에( 원할 때 사용 하지만 이는 nbd임) 스크립트가 실패합니다 .$NF$2"-""--"

하지만 거의 비슷합니다. 다음을 시도해 보세요.

$ awk 'BEGIN{FS=OFS="\t"} {print $0, $1 "--" $2}' STAN002_sasions.tsv
#gene1  gene2   #gene1--gene2
VAV1    THAP4   VAV1--THAP4
ZNF75A  ZNF263  ZNF75A--ZNF263
KRCC1   POLR1A  KRCC1--POLR1A
H2AFV   TANC1   H2AFV--TANC1
B3GALT6 RP3-340N1.5     B3GALT6--RP3-340N1.5
SH3BP1  CTD-2013M15.1(192243),EMB(3603711)      SH3BP1--CTD-2013M15.1(192243),EMB(3603711)
PTPRO   VASN    PTPRO--VASN

또는 입력/출력 예제에 표시된 것처럼 입력 파일의 첫 번째 줄에 있는 첫 번째 필드가 실제로 a로 시작할 수 있는 경우 #새 열 헤더를 생성할 때 해당 필드를 제거해야 합니다.

$ awk 'BEGIN{FS=OFS="\t"} {g=$1} NR==1{sub(/^#/,"",g)} {print $0, g "--" $2}' STAN002_sasions.tsv
#gene1  gene2   gene1--gene2
VAV1    THAP4   VAV1--THAP4
ZNF75A  ZNF263  ZNF75A--ZNF263
KRCC1   POLR1A  KRCC1--POLR1A
H2AFV   TANC1   H2AFV--TANC1
B3GALT6 RP3-340N1.5     B3GALT6--RP3-340N1.5
SH3BP1  CTD-2013M15.1(192243),EMB(3603711)      SH3BP1--CTD-2013M15.1(192243),EMB(3603711)
PTPRO   VASN    PTPRO--VASN

"내부" 편집을 위해 GNU awk가 있거나 설치할 수 있고 모든 파일을 한 번에 업데이트하려는 경우(분명히 문자열을 script위의 2개 스크립트 중 사용하기로 결정한 스크립트로 바꾸십시오):

awk -i inplace 'script' */*_sasions.tsv

그렇지 않으면 실행하는 데 시간이 더 오래 걸립니다.

tmp=$(mktemp) || exit
for file in */*_sasions.tsv; do
    awk 'script' "$file" > "$tmp" &&
    mv -- "$tmp" "$file"
done

관련 정보