다음과 같은 파일이 포함된 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
FS
or 를 지정하지 않았고 두 번째 필드를 식별하는 대신 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